home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / ASM / DISK30.ASM < prev    next >
Assembly Source File  |  2000-09-26  |  10KB  |  665 lines

  1. code   segment
  2.  
  3.  assume cs:code,ds:code,es:code,ss:code
  4.  
  5.  org 0
  6.  
  7.  
  8. laufwerke  equ 6
  9.  
  10. ger_num   equ 1
  11. befehl    equ 2
  12. status    equ 3
  13. anz_ger   equ 13
  14. wechsel   equ 14
  15. end_adr   equ 14
  16. p_adr     equ 14
  17. anz_bef   equ 16
  18. anzahl    equ 12h
  19. bpb_adr   equ 12h
  20. v_adr     equ 0fh
  21. sektor    equ 26
  22. ger_bez   equ 22
  23.  
  24. buf_seg   equ 22   ; DualPortedRAM->BufferRAM.PCOffset
  25.  
  26. bpb_sektoren equ 08h
  27. bpb_tracks   equ 0dh
  28. bpb_heads    equ 0fh
  29. bpb_secfat   equ 0bh
  30. bpb_secclu   equ 02h
  31. bpb_fats     equ 05h
  32. bpb_medbyte  equ 0ah
  33.  
  34. cmd       equ 16384
  35. arg1      equ cmd+00
  36. arg2      equ cmd+02
  37. arg3      equ cmd+04
  38. arg4      equ cmd+06
  39. arg5      equ cmd+08
  40. arg6      equ cmd+0A
  41. arg7      equ cmd+0C
  42.  
  43. arg6low   equ arg6+1
  44.  
  45. erst_b    equ this byte
  46.  
  47.  dw -1,-1
  48.  dw 0100100000000000b
  49.  dw offset strat
  50.  dw offset intr
  51.  db laufwerke
  52.  db 7 dup (0)
  53.  
  54. fkt_tab:
  55.  dw offset init
  56.  dw offset med_test
  57.  dw offset get_bpb
  58.  dw offset lesen
  59.  dw offset lesen
  60.  dw offset dummy
  61.  dw offset dummy
  62.  dw offset dummy
  63.  dw offset schreiben
  64.  dw offset schreiben
  65.  dw offset dummy
  66.  dw offset dummy
  67.  dw offset schreiben
  68.  dw offset dummy
  69.  dw offset dummy
  70.  dw offset wechselbar
  71.  dw offset schreiben
  72.  
  73. db_ptr     dw (?),(?)
  74.  
  75. bpb_ptr:
  76.       dw offset bpb1
  77.       dw offset bpb2
  78.       dw offset bpb3
  79.       dw offset bpb4  
  80.       dw offset bpb5
  81.       dw offset bpb6
  82. janus_seg  dw (?)    
  83. janus_ofs  dw (?)
  84.  
  85. bpb1:
  86.  dw 512
  87.  db 2
  88.  dw 1
  89.  db 2
  90.  dw 112
  91.  dw 1440
  92.  db 0F9h
  93.  dw 3
  94.  dw 9
  95.  dw 2
  96.  db 1,0,0,0
  97.  
  98. bpb2:
  99.  dw 512
  100.  db 2
  101.  dw 1
  102.  db 2
  103.  dw 112
  104.  dw 1440
  105.  db 0F9h
  106.  dw 3
  107.  dw 9
  108.  dw 2
  109.  db 1,0,0,0
  110.  
  111. bpb3:
  112.  dw 512
  113.  db 2
  114.  dw 1
  115.  db 2
  116.  dw 112
  117.  dw 1440
  118.  db 0F9h
  119.  dw 3
  120.  dw 9
  121.  dw 2
  122.  db 1,0,0,0
  123.  
  124. bpb4:
  125.  dw 512
  126.  db 2
  127.  dw 1
  128.  db 2
  129.  dw 112
  130.  dw 1440
  131.  db 0F9h
  132.  dw 3
  133.  dw 9
  134.  dw 2
  135.  db 1,0,0,0
  136.  
  137. bpb5:
  138.  dw 512
  139.  db 2
  140.  dw 1
  141.  db 2
  142.  dw 112
  143.  dw 1440
  144.  db 0F9h
  145.  dw 3
  146.  dw 9
  147.  dw 2
  148.  db 1,0,0,0
  149.  
  150. bpb6:
  151.  dw 512
  152.  db 2
  153.  dw 1
  154.  db 2
  155.  dw 112
  156.  dw 1440
  157.  db 0F9h
  158.  dw 3
  159.  dw 9
  160.  dw 2
  161.  db 1,0,0,0
  162.  
  163. vol_name:
  164.  db "DISKTRANS",0,0,0
  165.  
  166.  
  167. strat  proc far
  168.  mov cs:db_ptr,bx
  169.  mov cs:db_ptr+2,es
  170.  ret
  171. strat  endp
  172.  
  173.  
  174. intr   proc far
  175.  pusha
  176.  push es
  177.  push ds
  178.  pushf
  179.  
  180.  push cs
  181.  pop ds
  182.  
  183.  les di,dword ptr db_ptr
  184.  mov bl,es:b[di+befehl]
  185.  cmp bl,anz_bef
  186.  jle bc_okay
  187.  mov ax,8003h
  188.  jmp short intr_end
  189.  
  190. bc_okay:
  191.  shl bl,1
  192.  xor bh,bh
  193.  call [fkt_tab+bx]
  194.  
  195. intr_end  label near
  196.  push cs
  197.  pop ds
  198.  
  199.  les di,dword ptr db_ptr
  200.  or ax,0100h
  201.  mov es:[di+status],ax
  202.  
  203.  popf
  204.  pop ds
  205.  pop es
  206.  popa
  207.  ret
  208. intr  endp
  209.  
  210.  
  211. dummy   proc near
  212.  xor ax,ax
  213.  ret
  214. dummy   endp
  215.  
  216.  
  217. med_test  proc near
  218.  call near select_device
  219.  cmp ax,0
  220.  jne med_test_fehler
  221.  
  222.  push ds
  223.  mov ds,cs:janus_seg
  224.  mov si,cs:janus_ofs
  225.  mov ds:w[si+arg1],4
  226.  call near call_and_wait
  227.  mov ax,ds:w[si+arg2]
  228.  pop ds
  229.  
  230.  mov es:b[di+wechsel],al
  231.  mov ax,offset vol_name
  232.  mov es:w[di+v_adr],ax
  233.  mov es:w[di+v_adr+2],ds 
  234.  xor ax,ax
  235.  
  236. med_test_fehler:
  237.  ret
  238. med_test  endp
  239.  
  240.  
  241. get_bpb  proc near
  242.  call near select_device
  243.  cmp ax,0
  244.  je yyyy
  245.  
  246.  jmp near get_bpb_fehler
  247.  
  248. yyyy:
  249.  push ds
  250.  mov ds,cs:janus_seg
  251.  mov si,cs:janus_ofs
  252.  mov ds:w[si+arg1],4
  253.  call near call_and_wait
  254.  mov ax,ds:w[si+arg2]
  255.  pop ds
  256.  cmp al,0ff
  257.  jne xxxx
  258.  
  259.  jmp near get_bpb_fehler
  260.  
  261. xxxx:
  262.  
  263.  mov si,offset bpb_ptr
  264.  mov bl,es:b[di+ger_num] 
  265.  xor bh,bh
  266.  shl bx,1
  267.  add si,bx
  268.  mov si,cs:w[si]
  269.  mov word ptr es:[di+bpb_adr],si
  270.  mov word ptr es:[di+bpb_adr+2],ds
  271.  
  272.  xor ax,ax
  273. get_bpb_fehler:
  274.  ret
  275. get_bpb  endp
  276.  
  277.  
  278. wechselbar  proc near
  279.  xor ax,ax
  280.  ret
  281. wechselbar  endp
  282.  
  283.  
  284. schreiben  proc near
  285.  push di
  286.  push es
  287.  push ds
  288.  
  289.  call near select_device
  290.  cmp ax,0
  291.  je schreiben_device_okay
  292.  jmp near schreiben_fehler
  293.  
  294. schreiben_device_okay:
  295.  mov bx,es:w[di+anzahl]
  296.  mov dx,es:w[di+sektor]
  297.  lds si,es:[di+p_adr]
  298. schreiben_schleife:
  299.  cmp bx,0
  300.  je schreiben_okay
  301.  
  302.  mov bp,bx
  303.  cmp bp,32
  304.  jle schreiben_2
  305.  mov bp,32
  306.  
  307. schreiben_2:
  308.  push ds
  309.  push si
  310.  push es
  311.  push di
  312.  
  313.  mov es,cs:janus_seg
  314.  mov di,cs:janus_ofs
  315.  mov cx,bp
  316.  shl cx,9
  317.  rep movsb
  318.  
  319.  mov es,cs:janus_seg
  320.  mov di,cs:janus_ofs
  321.  mov es:w[di+arg1],1
  322.  mov es:w[di+arg2],bp
  323.  mov es:w[di+arg3],dx
  324.  call near call_and_wait
  325.  mov cx,es:w[di+arg2]
  326.  
  327.  pop di
  328.  pop es
  329.  pop si
  330.  pop ds
  331.  
  332.  cmp cx,0
  333.  je schreiben_3
  334.  mov ax,cx
  335.  jmp schreiben_fehler 
  336.  
  337. schreiben_3:
  338.  sub bx,bp
  339.  add dx,bp
  340.  mov cx,bp
  341.  shl cx,9
  342.  add si,cx
  343.  jmp schreiben_schleife
  344.  
  345. schreiben_okay:
  346.  call near motor
  347.  cmp cx,0
  348.  jne schreiben_4
  349.  xor ax,ax
  350.  jmp schreiben_fehler
  351.  
  352. schreiben_4:
  353.  mov ax,cx
  354.  
  355. schreiben_fehler:
  356.  pop ds
  357.  pop es
  358.  pop di
  359.  cmp ax,0
  360.  je schreiben_ende
  361.  mov es:w[di+anzahl],0
  362. schreiben_ende:
  363.  ret
  364. schreiben  endp
  365.  
  366.  
  367. lesen  proc near
  368.  push di
  369.  push es
  370.  push ds
  371.  
  372.  call near select_device
  373.  cmp ax,0
  374.  je lesen_device_okay
  375.  jmp near lesen_fehler
  376.  
  377. lesen_device_okay:
  378.  mov bx,es:[di+anzahl]
  379.  mov dx,es:[di+sektor]
  380.  les di,es:[di+p_adr]
  381.  
  382. lese_schleife:
  383.  cmp bx,0
  384.  je lesen_okay
  385.  mov bp,bx
  386.  cmp bp,32
  387.  jle lesen_2
  388.  mov bp,32
  389.  
  390. lesen_2:
  391.  push ds
  392.  push si
  393.  
  394.  mov ds,cs:janus_seg
  395.  mov si,cs:janus_ofs
  396.  mov ds:w[si+arg1],2
  397.  mov ds:w[si+arg2],bp
  398.  mov ds:w[si+arg3],dx
  399.  call near call_and_wait
  400.  mov cx,ds:w[si+arg2]
  401.  
  402.  pop si
  403.  pop ds
  404.  
  405.  cmp cx,0
  406.  je lesen_3
  407.  mov ax,cx
  408.  jmp lesen_fehler 
  409.  
  410. lesen_3:
  411.  push ds
  412.  push di
  413.  mov ds,cs:janus_seg
  414.  mov si,cs:janus_ofs
  415.  mov cx,bp
  416.  shl cx,9
  417.  rep movsb
  418.  pop di
  419.  pop ds
  420.  
  421.  sub bx,bp
  422.  add dx,bp
  423.  mov cx,bp
  424.  shl cx,9
  425.  add di,cx
  426.  jmp lese_schleife
  427. lesen_okay:
  428.  call near motor
  429.  cmp cx,0
  430.  jne lesen_4
  431.  xor ax,ax
  432.  jmp lesen_fehler
  433.  
  434. lesen_4:
  435.  mov ax,cx
  436.  
  437. lesen_fehler:
  438.  pop ds
  439.  pop es
  440.  pop di
  441.  cmp ax,0
  442.  je lesen_ende
  443.  mov es:w[di+anzahl],0
  444. lesen_ende:
  445.  ret
  446. lesen   endp
  447.  
  448.  
  449. motor  proc near
  450.  push es
  451.  push di
  452.  mov es,cs:janus_seg
  453.  mov di,cs:janus_ofs
  454.  mov es:w[di+arg1],3
  455.  call near call_and_wait
  456.  mov cx,es:w[di+arg2]
  457.  pop di
  458.  pop es
  459.  ret
  460. motor  endp
  461.  
  462.  
  463. call_and_wait  proc near
  464.  push ax
  465.  mov ah,7
  466.  mov al,29
  467.  int 0b
  468.  mov ah,8
  469.  mov al,29
  470.  int 0b
  471.  pop ax
  472.  ret
  473. call_and_wait  endp
  474.  
  475.  
  476. select_device  proc near
  477.  push ds
  478.  push es
  479.  push si
  480.  push di 
  481.  mov ds,cs:janus_seg
  482.  mov si,cs:janus_ofs
  483.  mov ds:w[si+arg1],100
  484.  mov bl,es:b[di+ger_num]
  485.  xor bh,bh
  486.  mov ds:w[si+arg2],bx
  487.  call near call_and_wait
  488.  mov ax,ds:w[si+arg2]
  489.  pop di
  490.  pop si
  491.  pop es
  492.  pop ds
  493.  ret
  494. select_device  endp
  495.  
  496.  
  497. treiber_ende  equ this byte
  498. ; ------------------ Ende des Treibers --------------------
  499.  
  500.  
  501. init   proc near
  502.  mov ah,30h
  503.  int 21h
  504.  cmp al,3
  505.  jb prinm
  506.  
  507.  mov cs:w[fkt_tab+00],offset dummy
  508.  
  509.  mov al,es:[di+ger_bez]
  510.  add al,"A"
  511.  mov ger_s,al
  512.  add al,laufwerke-1
  513.  mov ger_e,al 
  514.  
  515. prinm:
  516.  mov dx,offset initm
  517.  mov ah,9
  518.  int 21h
  519.  
  520.  push es
  521.  push di
  522.  
  523.  mov ah,1
  524.  mov al,29
  525.  int 0b
  526.  mov janus_ofs,di
  527.  mov janus_seg,es:w[buf_seg]
  528.  mov ax,di
  529.  
  530.  pop di
  531.  pop es
  532.  
  533.  cmp ax,-1
  534.  jne init_weiter
  535.  
  536.  mov dx,offset init_fehler_text
  537.  mov ah,9
  538.  int 21h
  539.  
  540.  mov word ptr es:[di+end_adr],offset erst_b
  541.  mov es:[di+end_adr+2],ds
  542.  mov byte ptr es:[di+anz_ger],0
  543.  mov ax,20
  544.  jmp init_ende
  545.  
  546. init_weiter:
  547.  mov word ptr es:[di+end_adr],offset treiber_ende
  548.  mov es:[di+end_adr+2],ds
  549.  mov byte ptr es:[di+anz_ger],laufwerke
  550.  mov word ptr es:[di+bpb_adr],offset bpb_ptr
  551.  mov es:w[di+bpb_adr+2],ds
  552.  
  553.  push es
  554.  push di
  555.  
  556.  mov es,cs:janus_seg
  557.  mov di,cs:janus_ofs
  558.  mov es:w[di+arg1],6
  559.  call near call_and_wait
  560.  
  561.  mov cx,0
  562. Kopiere_BPB:
  563.  mov es,cs:janus_seg
  564.  mov di,cs:janus_ofs
  565.  mov es:w[di+arg1],100
  566.  mov es:w[di+arg2],cx
  567.  call near call_and_wait
  568.  mov es:w[di+arg1],5
  569.  call near call_and_wait
  570.  
  571.  mov bx,es:w[di+arg7]
  572.  cmp bx,1
  573.  jne bx2
  574.  jmp bxokay
  575.  
  576. bx2:
  577.  cmp bx,2
  578.  jne bxx
  579.  
  580.  ; HD-Laufwerk
  581.  
  582.  jmp bxokay
  583.  
  584. bxx:
  585.  mov si,offset bpb_ptr
  586.  mov bx,cx
  587.  shl bx,1
  588.  add si,bx
  589.  mov si,ds:w[si] 
  590.  mov ds:w[si+bpb_sektoren],es:w[di+arg2]
  591.  mov ds:w[si+bpb_tracks],es:w[di+arg3]
  592.  mov ds:w[si+bpb_heads],es:w[di+arg4] 
  593.  mov ds:w[si+bpb_secfat],es:w[di+arg5]
  594.  mov bl,es:b[di+arg6low]
  595.  mov ds:b[si+bpb_secclu],bl
  596.  mov ds:b[si+bpb_fats],1
  597.  mov ds:b[si+bpb_medbyte],0FBH
  598.  
  599. bxokay: 
  600.  add cx,1
  601.  cmp cx,6
  602.  je Kopieren_Fertig
  603.  jmp Kopiere_BPB
  604.  
  605. Kopieren_Fertig:
  606.  pop di
  607.  pop es
  608.  
  609.  mov dx,offset init_okay_text
  610.  mov ah,9
  611.  int 21h
  612.  xor ax,ax
  613.  
  614. init_ende:
  615.  ret
  616. init  endp
  617.  
  618.  
  619. exe_start  proc far
  620.  push cs
  621.  pop ds
  622.  
  623.  mov dx,offset exe_text
  624.  mov ah,9
  625.  int 21h
  626.  
  627.  mov ax,4c00
  628.  int 21h
  629. exe_start  endp
  630.  
  631.  
  632. initm:
  633.  db "ATUtilities Disk Transfer  -  Version 3.0  2. August 1994",13,10
  634.  db "Copyright (C) 1993-1994 by Thomas Dreibholz.  All rights reserved.",13,10,"$"
  635.  
  636. init_okay_text:
  637.  db "Treiber wurde erfolgreich fr die Laufwerke "
  638. ger_s db "?"
  639.  db ": bis "
  640. ger_e db "?"
  641.  db ": installiert.",13,10,10,"$"
  642.  
  643. init_fehler_text:
  644.  db "Amiga-Handler an Janus-Interrupt 29 ist nicht aktiv!",13,10
  645.  db "Bitte berprfen Sie die Installation der ATUtilities",13,10
  646.  db "Treiber konnte nicht installiert werden.",13,10,10,"$"
  647.  
  648. exe_text:
  649.  db "ATUtilities Disk Transfer:",13,10
  650.  db "Dieses Programm ist ein Laufwerkstreiber und kann deshalb nicht direkt aufge-",13,10
  651.  db "rufen werden. Um den Treiber zu installieren, muá folgende Zeile in die",13,10
  652.  db "CONFIG.SYS eingefgt werden:",13,10,10
  653.  db "DEVICE=Lw:\Verz\DISK.EXE",13,10,10
  654.  db "Nach dem n„chsten Reset stehen dann die neuen Laufwerke zur Verfgung. Bei",13,10
  655.  db "der Installation durch die CONFIG.SYS muá auf dem Amiga das Programm",13,10
  656.  db "Disk Transfer aktiv sein. Zur Vorbereitung und Formatierung und zum Kopieren",13,10
  657.  db "von Disk Transfer-Speichermedien sollte das Programm PREP.EXE benutzt werden.",13,10
  658.  db "Zur Beschleunigung von Zugriffen sollte in der CONFIG.SYS der Eintrag BUFFERS",13,10
  659.  db "auf 15 bis 20 gesetzt werden, oder ein Cache-Programm genutzt werden.",13,10,10,10
  660.  db "17. 09. 1993  -  Version 2.0  Copyright (C) 1993 by Thomas Dreibholz",13,10,10,"$"
  661.  
  662. code  ends
  663.  end exe_start
  664.  
  665.